/*
1 获取用户的收货地址
  1 绑定点击事件
  2 调用小程序内置 api  获取用户的收货地址  wx.chooseAddress

  2 获取 用户 对小程序 所授予 获取地址的  权限 状态 scope
    1 假设 用户 点击获取收货地址的提示框 确定  authSetting scope.address
      scope 值 true 直接调用 获取收货地址
    2 假设 用户 从来没有调用过 收货地址的api
      scope undefined 直接调用 获取收货地址
    3 假设 用户 点击获取收货地址的提示框 取消
      scope 值 false
      1 诱导用户 自己 打开 授权设置页面(wx.openSetting) 当用户重新给与 获取地址权限的时候
      2 获取收货地址
    4 把获取到的收货地址 存入到 本地存储中
2 页面加载完毕
  0 onLoad  onShow
  1 获取本地存储中的地址数据
  2 把数据 设置给data中的一个变量
3 onShow
  0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
    1 num=1;
    2 checked=true;
  1 获取缓存中的购物车数组
  2 把购物车数据 填充到data中
4 全选的实现 数据的展示
  1 onShow 获取缓存中的购物车数组
  2 根据购物车中的商品数据 所有的商品都被选中 checked=true  全选就被选中
5 总价格和总数量
  1 都需要商品被选中 我们才拿它来计算
  2 获取购物车数组
  3 遍历
  4 判断商品是否被选中
  5 总价格 += 商品的单价 * 商品的数量
  5 总数量 +=商品的数量
  6 把计算后的价格和数量 设置回data中即可
6 商品的选中
  1 绑定change事件
  2 获取到被修改的商品对象
  3 商品对象的选中状态 取反
  4 重新填充回data中和缓存中
  5 重新计算全选。总价格 总数量。。。
7 全选和反选
  1 全选复选框绑定事件 change
  2 获取 data中的全选变量 allChecked
  3 直接取反 allChecked=!allChecked
  4 遍历购物车数组 让里面 商品 选中状态跟随  allChecked 改变而改变
  5 把购物车数组 和 allChecked 重新设置回data 把购物车重新设置回 缓存中
8 商品数量的编辑
  1 "+" "-" 按钮 绑定同一个点击事件 区分的关键 自定义属性
    1 “+” "+1"
    2 "-" "-1"
  2 传递被点击的商品id goods_id
  3 获取data中的购物车数组 来获取需要被修改的商品对象
  4 当 购物车的数量 =1 同时 用户 点击 "-"
    弹窗提示(showModal) 询问用户 是否要删除
    1 确定 直接执行删除
    2 取消  什么都不做
  4 直接修改商品对象的数量 num
  5 把cart数组 重新设置回 缓存中 和data中 this.setCart
9 点击结算
  1 判断有没有收货地址信息
  2 判断用户有没有选购商品
  3 经过以上的验证 跳转到 支付页面！
 */

import {request} from "../../request/index";
import regeneratorRuntime from '../../lib/runtime/runtime';
import {getSetting, openSetting, chooseAddress, showModal, showToast} from '../../utils/asyncWX';

Page({
        data: {
            address: {},
            cart: [],
            allChecked: false,
            totalPrice: 0,
            totalNum: 0
        },

        onShow: function (options) {
            //获取收获地址信息
            const address = wx.getStorageSync('address') || {};
            this.setData({address});

            //获取缓存中的购物车数据
            const cart = wx.getStorageSync('cart') || [];

            //设置购物车
            this.setCart(cart);
        },

        async handleChooseAddress() {
            //查看官网的scope列表，chooseAddress 这个api已经取消了授权设置，可以直接调用。换句话说如果到setting里查看它的scope，永远为true。
            try {
                const setting = await getSetting();
                const scopeAddress = setting.authSetting['scope.address'];
                if (scopeAddress === false) {
                    await openSetting();
                }
                const address = await chooseAddress();
                address.full = address.provinceName + address.cityName + address.countyName + address.detailInfo;

                //存入本地缓存
                wx.setStorageSync('address', address);
            } catch (err) {
                console.log(err);
            }
        },

        setCart(cart) {
            //是否全部选中
            const allChecked = cart && cart.length ? cart.every(item => item.checked) : false;
            //计算总数量和总价格
            const totalObj = {totalPrice: 0, totalNum: 0};
            cart.reduce((prev, cur) => {
                if (cur.checked) {
                    prev.totalNum += cur.num;
                    prev.totalPrice += cur.num * cur.goods_price;
                }
                return totalObj;
            }, totalObj);

            this.setData({cart, allChecked, totalPrice: totalObj.totalPrice, totalNum: totalObj.totalNum});

            //更新缓存
            wx.setStorageSync('cart', cart);
        },

        handleItemChange(e) {
            const {id} = e.currentTarget.dataset;
            const {cart} = this.data;
            const newCart = cart.map(item => {
                if (item.goods_id === id) {
                    let newItem;
                    if (item.checked) {
                        newItem = {...item, checked: false};
                    } else {
                        newItem = {...item, checked: true};
                    }
                    return newItem;
                }
                return item;
            });
            this.setCart(newCart);
        },


        handleAllCheck() {
            const {allChecked, cart} = this.data;
            const newCart = cart.map(item => ({...item, checked: !allChecked}));
            this.setCart(newCart);
        },

        async handleItemNumEdit(e) {
            const {operation, id} = e.currentTarget.dataset;
            const {cart} = this.data;
            const index = cart.findIndex(item => item.goods_id === id);
            if (cart[index].num === 1 && operation === -1) {
                const res = await showModal({title: '提示', content: '是否要删除该商品?'});
                if (res.confirm) {
                    cart.splice(index, 1);
                    this.setCart(cart);
                }
            } else {
                cart[index].num += operation;
                this.setCart(cart);
            }
        },

        async handlePay() {
            const {address, totalNum} = this.data;
            if (!address.userName) {
                await showToast({title: '您还没有选择收获地址', icon: 'none'});
                return;
            }
            if (!totalNum) {
                await showToast({title: '您还没有选购商品', icon: 'none'});
                return;
            }
            //跳转支付页面
            wx.navigateTo({
                url: '/pages/pay/index'
            });
        }
    }
)
